{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[nltk_data] Downloading package stopwords to /root/nltk_data...\n",
      "[nltk_data]   Package stopwords is already up-to-date!\n"
     ]
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "from ast import literal_eval\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "from scipy import sparse as sp_sparse\n",
    "from sklearn.feature_extraction.text import TfidfVectorizer\n",
    "from sklearn.preprocessing import MultiLabelBinarizer\n",
    "from sklearn.naive_bayes import MultinomialNB\n",
    "from sklearn.multiclass import OneVsRestClassifier\n",
    "from sklearn.linear_model import LogisticRegression, RidgeClassifier\n",
    "from sklearn.svm import LinearSVC\n",
    "from sklearn.pipeline import Pipeline\n",
    "from sklearn.feature_extraction.text import CountVectorizer\n",
    "import nltk\n",
    "import re\n",
    "from nltk.corpus import stopwords\n",
    "nltk.download('stopwords')\n",
    "stop_words = set(stopwords.words('english'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "100000\n",
      "30000\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>title</th>\n",
       "      <th>tags</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>48222</th>\n",
       "      <td>how to dynamically get the image from the wind...</td>\n",
       "      <td>[c#, sql-server, winforms, image]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8119</th>\n",
       "      <td>numpy ndarrays: row-wise and column-wise opera...</td>\n",
       "      <td>[python, arrays, numpy]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10857</th>\n",
       "      <td>Create a tilt-shift filter like instagram in o...</td>\n",
       "      <td>[objective-c, ios]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>44403</th>\n",
       "      <td>How to simulate the Out Of memory : Requested ...</td>\n",
       "      <td>[java]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>66683</th>\n",
       "      <td>PHP: URL friendly strings</td>\n",
       "      <td>[php, string]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>88655</th>\n",
       "      <td>Why are extension methods only allowed in non-...</td>\n",
       "      <td>[c#]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>41863</th>\n",
       "      <td>Can't reference controls in code behind. Visua...</td>\n",
       "      <td>[asp.net, vb.net]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>57150</th>\n",
       "      <td>SQL and Java return different dates?</td>\n",
       "      <td>[java, sql, sql-server, date]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>64002</th>\n",
       "      <td>How can I determine how much memory my program...</td>\n",
       "      <td>[c#, .net]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>69521</th>\n",
       "      <td>Android: Pause/Resume Timer OR Thread</td>\n",
       "      <td>[java, android, multithreading]</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                   title  \\\n",
       "48222  how to dynamically get the image from the wind...   \n",
       "8119   numpy ndarrays: row-wise and column-wise opera...   \n",
       "10857  Create a tilt-shift filter like instagram in o...   \n",
       "44403  How to simulate the Out Of memory : Requested ...   \n",
       "66683                          PHP: URL friendly strings   \n",
       "88655  Why are extension methods only allowed in non-...   \n",
       "41863  Can't reference controls in code behind. Visua...   \n",
       "57150               SQL and Java return different dates?   \n",
       "64002  How can I determine how much memory my program...   \n",
       "69521              Android: Pause/Resume Timer OR Thread   \n",
       "\n",
       "                                    tags  \n",
       "48222  [c#, sql-server, winforms, image]  \n",
       "8119             [python, arrays, numpy]  \n",
       "10857                 [objective-c, ios]  \n",
       "44403                             [java]  \n",
       "66683                      [php, string]  \n",
       "88655                               [c#]  \n",
       "41863                  [asp.net, vb.net]  \n",
       "57150      [java, sql, sql-server, date]  \n",
       "64002                         [c#, .net]  \n",
       "69521    [java, android, multithreading]  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def read_data(filename):\n",
    "    data = pd.read_csv(filename, sep='\\t')\n",
    "    data['tags'] = data['tags'].apply(literal_eval)\n",
    "    return data\n",
    "\n",
    "train = read_data('./data/Multil_label_data/train.tsv')\n",
    "validation = read_data('./data/Multil_label_data/validation.tsv')\n",
    "\n",
    "print(len(train))\n",
    "print(len(validation))\n",
    "train.sample(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "标签总数: 100\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>tag</th>\n",
       "      <th>count</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>javascript</td>\n",
       "      <td>19078</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>91</th>\n",
       "      <td>c#</td>\n",
       "      <td>19077</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>95</th>\n",
       "      <td>java</td>\n",
       "      <td>18661</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>84</th>\n",
       "      <td>php</td>\n",
       "      <td>13907</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>85</th>\n",
       "      <td>python</td>\n",
       "      <td>8940</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>53</th>\n",
       "      <td>jquery</td>\n",
       "      <td>7510</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>81</th>\n",
       "      <td>c++</td>\n",
       "      <td>6469</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>67</th>\n",
       "      <td>html</td>\n",
       "      <td>4668</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>68</th>\n",
       "      <td>objective-c</td>\n",
       "      <td>4338</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>47</th>\n",
       "      <td>asp.net</td>\n",
       "      <td>3939</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            tag  count\n",
       "19   javascript  19078\n",
       "91           c#  19077\n",
       "95         java  18661\n",
       "84          php  13907\n",
       "85       python   8940\n",
       "53       jquery   7510\n",
       "81          c++   6469\n",
       "67         html   4668\n",
       "68  objective-c   4338\n",
       "47      asp.net   3939"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tags = train['tags'].values\n",
    "tag_dic={}\n",
    "for tag_list in tags:\n",
    "    for tag in tag_list:        \n",
    "        if tag not in tag_dic:\n",
    "            tag_dic[tag]=1\n",
    "        else:\n",
    "             tag_dic[tag]+=1\n",
    "df = pd.DataFrame(list(tag_dic.items()), columns=['tag', 'count']).sort_values(by = 'count',axis = 0,ascending = False)\n",
    "print('标签总数:',len(df))\n",
    "df.head(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5,0,'标签')"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f2af823c630>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#前10个数量最多的标签分布\n",
    "df[:10].plot(x='tag', y='count', kind='bar', legend=False, grid=True, figsize=(10, 6),fontsize=18)\n",
    "plt.title(\"每个标签的分布\",fontsize=18)\n",
    "plt.ylabel('出现次数', fontsize=18)\n",
    "plt.xlabel('标签', fontsize=18)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5,0,'标签数')"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f2af81e35f8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "tagCount=train['tags'].apply(lambda x : len(x))\n",
    "x = tagCount.value_counts()\n",
    "#plot\n",
    "plt.figure(figsize=(8,5))\n",
    "ax = sns.barplot(x.index, x.values)\n",
    "plt.title(\"标签数量分布\",fontsize=15)\n",
    "plt.ylabel('数量', fontsize=15)\n",
    "plt.xlabel('标签数', fontsize=15)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x7f2af81535c0>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nds44KMQXALcET31yUHjaEQBgoOE7X1X1XJIfS/JCd39m9OcHgLeyit2zVbADd2sbGl9V9USS27r7\noar6UlXd391/N3IOALDficBb2+idr2NJTk/HLyZ5OMla42u//AUHgP3GeXTfH6Pj664kr07Hl5L8\ny2vvUFVPJ3l6+vDNqvqfg+a2bu9I8t11T2KfsSY7WY+drMdO1mMn67HT2tajfn8dn/Wmvl/r8a5F\n7jQ6vt5Mcmg6vjs3OOG/u08lOTVyUvtBVZ3v7s11z2M/sSY7WY+drMdO1mMn67GT9dhp3esx+tWO\nF7L9VGOSPJBka/DnBwBYq9E7X/8lydmqOpLk8SQPDv78AABrNXTnq7svZfuk+5eTPNrdb4z8/Pvc\n7J5qXYA12cl67GQ9drIeO1mPnazHTmtdj+rudX5+AIBZcYV7AICBxNeaVNUPVdXXq+obVfWnVXVn\nVT1XVeeq6tl1z29dqupwVX17OrYe2xcj/sh0PNv1qKp7q+qFqjpbVX84jc1yPabvkbPT8R1V9bVp\nHZ56q7Fb2TXrcV9VvVRVL1bVqdo22/W4auxfV9V/nY5ntR7JW67JV6vqfdPx8DURX+vz8SSf7+7H\nkryW5GOZrv6f5EhV3b/W2a3P55IcuvrdEDLT9aiqR5L8SHf/mfXIJ5J8pbsfSXJPVf1GZrgeVXVv\nkuezfc3EJPl0kvPTOny4qu55i7Fb0g3W45eS/Ep3fzDJO5O8N/Nej1RVJfl8kjunodmsR/KWa/Lx\nJP+ru789DQ1fE/G1Jt39pe7+xvThRpKfz/VX/5+Vqvpgkn/Odowey4zXo6ruSPJHSbaq6mcy8/VI\n8o9JfrSqfjjbv1SPZp7r8b0kT2b7ItXJzr8X55JsvsXYrWrHenT3M939N9Ntb8/2RTSPZabrMfmF\nJP/tqo+PZT7rkVyzJlX1tiT/LsnrVfXodJ9jGbwm4mvNqur9Se5N8g/ZefX/w2ub1BpU1Z1JfivJ\niWno2ndDmNV6JPlkkr9O8tkkP5XkU5n3evxFkvuT/GqSv03yA5nhenT3pWteJX6j75PZfO/cYD2S\nJFX1ZJK/6u7vZMbrUVVvz/Y/7D931d1msx7JDf+O/Nsk/znJf0zyyar6aNawJuJrjaYC/0KSp7LA\n1f9vcSeSfLG7/2n6eO7r8b4kp7r7tSRfSfLNzHs9fjfJL3f372Q7vn4u816Py270fTLr752qeneS\nX0/ya9PQnNfjZJLf7O7/e9XYnNcj2f7Z+sXpZ+vpbO96DV+TuS36vjHt9JzO9jfGK3H1/w8l+VRV\nvZTkJ5J8JPNej79P8u7peDPbT7PNeT1+MMl7q+q2JD+d7V8qc16Py270c2O2P0um83v+JMlTV+12\nzHY9kvybJL9/+edqVX0m816P5PqfrWv5/Tv6Cvdc8YtJfjLJM1X1TJIvJ/nEXK/+390fuHw8/aD4\naOb9bgjPJfnjqvpYkjuy/a+zr854PX4v298j70ryl0n+IPP++3HZ80lemF6c8Z4k38r20yfXjs3F\niST3JfnC9nnm+e3ceI1mobv/1eXjqnqpu5+tqndlpusx+WyS/zT93v0/SZ5I8rYMXhMXWd1Hpn+1\nPZbkm9OW6KxZj52sx07WY9sUoA8n+fPLuz03Gpsz67GT9bje6DURXwAAAznnCwBgIPEFADCQ+AIA\nGEh8AQAMJL4AAAYSXwAAA/0/DKxWT006YFcAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f2af9e1f978>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "lens = train.title.str.len()\n",
    "lens.hist(bins = 30,figsize=(10, 6),grid=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "title 为空的数量: 0\n",
      "tags 为空的数量: 0\n"
     ]
    }
   ],
   "source": [
    "print('title 为空的数量:',train['title'].isnull().sum())\n",
    "print('tags 为空的数量:',train['tags'].isnull().sum())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "#用空格替换各种符号\n",
    "REPLACE_BY_SPACE_RE = re.compile('[/(){}\\[\\]\\|@,;]') \n",
    "#删除各种符号\n",
    "BAD_SYMBOLS_RE = re.compile('[^0-9a-z #+_]')\n",
    "STOPWORDS = set(stopwords.words('english'))\n",
    "#定义数据清洗函数\n",
    "def text_prepare(text):\n",
    "    text = text.lower() # 字母小写化\n",
    "    text = REPLACE_BY_SPACE_RE.sub(' ',text) \n",
    "    text = BAD_SYMBOLS_RE.sub('',text)    \n",
    "    text = ' '.join([w for w in text.split() if w not in STOPWORDS]) # 删除停用词\n",
    "    return text"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['draw stacked dotplot r',\n",
       " 'mysql select records datetime field less specified value',\n",
       " 'terminate windows phone 81 app',\n",
       " 'get current time specific country via jquery',\n",
       " 'configuring tomcat use ssl',\n",
       " 'awesome nested set plugin add new children tree various levels',\n",
       " 'create map json response ruby rails 3',\n",
       " 'rspec test method called',\n",
       " 'springboot catalina lifecycle exception',\n",
       " 'import data excel mysql database using php']"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train, y_train = train.title, train.tags\n",
    "X_val, y_val = validation.title, validation.tags\n",
    "\n",
    "#开始进行数据清洗\n",
    "X_train = [text_prepare(x) for x in X_train]\n",
    "X_val = [text_prepare(x) for x in X_val]\n",
    "X_train[:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(100000, 18300)\n",
      "\n",
      "  (0, 12748)\t1\n",
      "  (0, 14941)\t1\n",
      "  (0, 4792)\t1\n",
      "  (1, 4093)\t1\n",
      "  (1, 14054)\t1\n",
      "  (1, 10426)\t1\n",
      "  (1, 17129)\t1\n",
      "  (1, 14801)\t1\n",
      "  (1, 9077)\t1\n",
      "  (1, 5815)\t1\n",
      "  (1, 4089)\t1\n",
      "  (1, 13008)\t1\n",
      "  (1, 14019)\t1\n",
      "  (1, 10394)\t1\n",
      "  (2, 244)\t1\n",
      "  (2, 11718)\t1\n",
      "  (2, 17871)\t1\n",
      "  (2, 887)\t1\n",
      "  (2, 243)\t1\n",
      "  (2, 11715)\t1\n",
      "  (2, 17849)\t1\n",
      "  (2, 15706)\t1\n",
      "  (3, 17433)\t1\n",
      "  (3, 15916)\t1\n",
      "  (3, 3742)\t1\n",
      "  :\t:\n",
      "  (99997, 5228)\t1\n",
      "  (99997, 14548)\t1\n",
      "  (99997, 14224)\t1\n",
      "  (99997, 13991)\t1\n",
      "  (99997, 12611)\t1\n",
      "  (99997, 11406)\t1\n",
      "  (99997, 12531)\t1\n",
      "  (99998, 4861)\t1\n",
      "  (99998, 5462)\t1\n",
      "  (99998, 925)\t1\n",
      "  (99998, 5453)\t1\n",
      "  (99998, 4856)\t1\n",
      "  (99998, 2418)\t1\n",
      "  (99998, 14702)\t1\n",
      "  (99998, 7068)\t1\n",
      "  (99998, 8650)\t1\n",
      "  (99998, 13655)\t1\n",
      "  (99998, 8189)\t1\n",
      "  (99998, 15887)\t1\n",
      "  (99998, 6669)\t1\n",
      "  (99999, 3581)\t1\n",
      "  (99999, 12248)\t1\n",
      "  (99999, 7998)\t1\n",
      "  (99999, 9242)\t1\n",
      "  (99999, 3554)\t1\n"
     ]
    }
   ],
   "source": [
    "cv = CountVectorizer(min_df=5,max_df=0.9,ngram_range=(1,2),token_pattern= '(\\S+)')\n",
    "feature = cv.fit_transform(X_train)\n",
    "print(feature.shape)\n",
    "print()\n",
    "print(feature)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(100000, 18300)\n",
      "\n",
      "  (0, 4792)\t0.5535025387941576\n",
      "  (0, 14941)\t0.7126565202061851\n",
      "  (0, 12748)\t0.4309937630129157\n",
      "  (1, 10394)\t0.20888863770024907\n",
      "  (1, 14019)\t0.22859508855051242\n",
      "  (1, 13008)\t0.2975359437533551\n",
      "  (1, 4089)\t0.2692803496632626\n",
      "  (1, 5815)\t0.2382368446529078\n",
      "  (1, 9077)\t0.3287166709387216\n",
      "  (1, 14801)\t0.29994308533196384\n",
      "  (1, 17129)\t0.18110148646398525\n",
      "  (1, 10426)\t0.3621376616529093\n",
      "  (1, 14054)\t0.4089312040982416\n",
      "  (1, 4093)\t0.39639224964237335\n",
      "  (2, 15706)\t0.39670241033325887\n",
      "  (2, 17849)\t0.2351453036010898\n",
      "  (2, 11715)\t0.3142739731167221\n",
      "  (2, 243)\t0.3716293832627843\n",
      "  (2, 887)\t0.24411894290285438\n",
      "  (2, 17871)\t0.3339121637039692\n",
      "  (2, 11718)\t0.3941792153794798\n",
      "  (2, 244)\t0.47327445521243877\n",
      "  (3, 6669)\t0.1692707961113005\n",
      "  (3, 3725)\t0.2552495715162359\n",
      "  (3, 15887)\t0.2234965219589451\n",
      "  :\t:\n",
      "  (99997, 12611)\t0.34104556902584193\n",
      "  (99997, 13991)\t0.3067513613267025\n",
      "  (99997, 14224)\t0.31389333347252774\n",
      "  (99997, 14548)\t0.37281164824471513\n",
      "  (99997, 5228)\t0.38155271570832655\n",
      "  (99997, 4104)\t0.4040911075960819\n",
      "  (99997, 11413)\t0.3867834602428051\n",
      "  (99998, 6669)\t0.15241657509350534\n",
      "  (99998, 15887)\t0.20124306853200105\n",
      "  (99998, 8189)\t0.2259396945657713\n",
      "  (99998, 13655)\t0.23467406443051372\n",
      "  (99998, 8650)\t0.2857095103430595\n",
      "  (99998, 7068)\t0.3203224500847147\n",
      "  (99998, 14702)\t0.24582885678575236\n",
      "  (99998, 2418)\t0.27918151790510803\n",
      "  (99998, 4856)\t0.2638517138799303\n",
      "  (99998, 5453)\t0.2555556710945007\n",
      "  (99998, 925)\t0.3552208262132948\n",
      "  (99998, 5462)\t0.33317397565247864\n",
      "  (99998, 4861)\t0.3680027831918835\n",
      "  (99999, 3554)\t0.3107248255546412\n",
      "  (99999, 9242)\t0.30183146214246015\n",
      "  (99999, 7998)\t0.39056130428842706\n",
      "  (99999, 12248)\t0.5517043750400694\n",
      "  (99999, 3581)\t0.5961811816882109\n"
     ]
    }
   ],
   "source": [
    "tfidf = TfidfVectorizer(min_df=5,max_df=0.9,ngram_range=(1,2),token_pattern= '(\\S+)')\n",
    "feature = tfidf.fit_transform(X_train)\n",
    "print(feature.shape)\n",
    "print()\n",
    "print(feature)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(100000, 100)\n",
      "['r']\n",
      "[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n",
      " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0\n",
      " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n"
     ]
    }
   ],
   "source": [
    "#生成多标签的词袋矩阵\n",
    "mlb = MultiLabelBinarizer(classes=sorted(tag_dic.keys()))\n",
    "y_train = mlb.fit_transform(y_train)\n",
    "y_val = mlb.fit_transform(y_val)\n",
    "print(y_train.shape)\n",
    "print(train.tags[0])\n",
    "print(y_train[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "from sklearn.metrics import f1_score\n",
    "from sklearn.metrics import roc_auc_score \n",
    "from sklearn.metrics import average_precision_score\n",
    "from sklearn.metrics import recall_score\n",
    "\n",
    "def print_evaluation_scores(y_val, predicted):\n",
    "    accuracy=accuracy_score(y_val, predicted)\n",
    "    f1_score_macro=f1_score(y_val, predicted, average='macro')\n",
    "    f1_score_micro=f1_score(y_val, predicted, average='micro')\n",
    "    f1_score_weighted=f1_score(y_val, predicted, average='weighted')\n",
    "    print(\"accuracy:\",accuracy)\n",
    "    print(\"f1_score_macro:\",f1_score_macro)\n",
    "    print(\"f1_score_micro:\",f1_score_micro)\n",
    "    print(\"f1_score_weighted:\",f1_score_weighted)\n",
    "#     print(\"precision_macro:\",precision_macro)\n",
    "#     print(\"precision_micro:\",precision_micro)\n",
    "#     print(\"precision_weighted:\",precision_weighted)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1.TF-IDF+朴素贝叶斯"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python3.5/dist-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
      "  'precision', 'predicted', average, warn_for)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.19816666666666666\n",
      "f1_score_macro: 0.1106804556671684\n",
      "f1_score_micro: 0.4602042387232514\n",
      "f1_score_weighted: 0.398129431834211\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python3.5/dist-packages/sklearn/metrics/classification.py:1135: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 in labels with no predicted samples.\n",
      "  'precision', 'predicted', average, warn_for)\n"
     ]
    }
   ],
   "source": [
    "#朴素贝叶斯模型\n",
    "NB_pipeline = Pipeline([\n",
    "                ('tfidf', TfidfVectorizer(min_df=5,max_df=0.9,ngram_range=(1,2),token_pattern= '(\\S+)')),\n",
    "                ('clf', OneVsRestClassifier(MultinomialNB())),\n",
    "            ])\n",
    "\n",
    "NB_pipeline.fit(X_train,y_train)\n",
    "predicted = NB_pipeline.predict(X_val)\n",
    "print_evaluation_scores(y_val,predicted)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. TF-IDF+线性支持向量机"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.3762666666666667\n",
      "f1_score_macro: 0.5206782843884173\n",
      "f1_score_micro: 0.6849080977713582\n",
      "f1_score_weighted: 0.6614169003852886\n"
     ]
    }
   ],
   "source": [
    "SVC_pipeline = Pipeline([\n",
    "                ('tfidf', TfidfVectorizer(min_df=5,max_df=0.9,ngram_range=(1,2),token_pattern= '(\\S+)')),\n",
    "                ('clf', OneVsRestClassifier(LinearSVC(), n_jobs=1)),\n",
    "            ])\n",
    "\n",
    "SVC_pipeline.fit(X_train,y_train)\n",
    "predicted = SVC_pipeline.predict(X_val)\n",
    "print_evaluation_scores(y_val,predicted)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3.TF-IDF+逻辑回归"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.33393333333333336\n",
      "f1_score_macro: 0.44570816904771116\n",
      "f1_score_micro: 0.6418085281077235\n",
      "f1_score_weighted: 0.614350867051105\n"
     ]
    }
   ],
   "source": [
    "LogReg_pipeline = Pipeline([\n",
    "                ('tfidf', TfidfVectorizer(min_df=5,max_df=0.9,ngram_range=(1,2),token_pattern= '(\\S+)')),\n",
    "                ('clf', OneVsRestClassifier(LogisticRegression(), n_jobs=1)),\n",
    "            ])\n",
    "\n",
    "LogReg_pipeline.fit(X_train,y_train)\n",
    "predicted = LogReg_pipeline.predict(X_val)\n",
    "print_evaluation_scores(y_val,predicted)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4. CountVectorizer+朴素贝叶斯 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.28733333333333333\n",
      "f1_score_macro: 0.4494407482839465\n",
      "f1_score_micro: 0.6405520891066098\n",
      "f1_score_weighted: 0.6270586794953129\n"
     ]
    }
   ],
   "source": [
    "NB_pipeline = Pipeline([\n",
    "                ('cv', CountVectorizer(min_df=5,max_df=0.9,ngram_range=(1,2),token_pattern= '(\\S+)')),\n",
    "                ('clf', OneVsRestClassifier(MultinomialNB(\n",
    "                    fit_prior=True, class_prior=None))),\n",
    "            ])\n",
    "\n",
    "NB_pipeline.fit(X_train,y_train)\n",
    "predicted = NB_pipeline.predict(X_val)\n",
    "print_evaluation_scores(y_val,predicted)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5. CountVectorizer+线性支持向量机  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.3384333333333333\n",
      "f1_score_macro: 0.5166982868428124\n",
      "f1_score_micro: 0.6618965500814604\n",
      "f1_score_weighted: 0.6495951881680853\n"
     ]
    }
   ],
   "source": [
    "SVC_pipeline = Pipeline([\n",
    "                ('cv', CountVectorizer(min_df=5,max_df=0.9,ngram_range=(1,2),token_pattern= '(\\S+)')),\n",
    "                ('clf', OneVsRestClassifier(LinearSVC(), n_jobs=1)),\n",
    "            ])\n",
    "\n",
    "SVC_pipeline.fit(X_train,y_train)\n",
    "predicted = SVC_pipeline.predict(X_val)\n",
    "print_evaluation_scores(y_val,predicted)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 6. CountVectorizer+逻辑回归  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.35923333333333335\n",
      "f1_score_macro: 0.5067686700489948\n",
      "f1_score_micro: 0.6745877038274699\n",
      "f1_score_weighted: 0.6525450161539913\n"
     ]
    }
   ],
   "source": [
    "LogReg_pipeline = Pipeline([\n",
    "                ('cv', CountVectorizer(min_df=5,max_df=0.9,ngram_range=(1,2),token_pattern= '(\\S+)')),\n",
    "                ('clf', OneVsRestClassifier(LogisticRegression(), n_jobs=1)),\n",
    "            ])\n",
    "\n",
    "LogReg_pipeline.fit(X_train,y_train)\n",
    "predicted = LogReg_pipeline.predict(X_val)\n",
    "print_evaluation_scores(y_val,predicted)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
